﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace CMS_GYM.Interface
{
    public partial class frmXuatPhieuThu : Form
    {
        #region Attributes
        private clsKhachHangDTO KhachHang = null;
        private string MaKhachHangVangLaiCauLong = string.Empty;
        public Boolean isThuTienVangLaiCauLong = false;
        #endregion

        #region Construction
        public frmXuatPhieuThu()
        {
            InitializeComponent();
        }

        /// <summary>
        /// Khoi tao phieu thu dung tinh tien khach hang vang lai cau long
        /// ma khach hang cau long vang lai CLVL
        /// </summary>
        /// <param name="KhachHang"></param>
        /// <param name="TuGio"></param>
        /// <param name="DenGio"></param>
        public frmXuatPhieuThu(int KhachHangId,string MaKhachHang, string HoTen, DateTime TuGio, DateTime DenGio, double SoTien)
        {
            InitializeComponent();
            try
            {
                MaKhachHangVangLaiCauLong = MaKhachHang;
                KhoiTaoManHinh();
                KhoiTaoThuTienVangLaiCauLong(KhachHangId, MaKhachHang, HoTen, TuGio, DenGio, SoTien);
            }
            catch (Exception)
            { }

        }

        #endregion

        #region Events
        // Hàm bắt sự kiện nhấn một phím trên Form. CTRL + ....
        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            bool bKetQua = false;
            try
            {

                //------------------------------------
                if (keyData == Keys.Escape || (keyData == (Keys.Control | Keys.W)))
                {
                    this.Close();
                    bKetQua = true;
                }
                else if ((keyData == (Keys.Control | Keys.T)))
                {
                    btnChuyenXuong_Click(null, null);
                }
                else if ((keyData == (Keys.Alt | Keys.T)))
                {
                    this.gvPhieuThuChiTiet.Focus();
                    ThemMotDongTrong();
                    if (txtMaKhachHang.Text.ToUpper() == "THVL")
                    {
                        KhoiTaoThuTienVangLaiTheHinh();
                    }
                    gvPhieuThuChiTiet.CurrentCell = gvPhieuThuChiTiet.Rows[gvPhieuThuChiTiet.Rows.Count - 1].Cells["NoiDungThu"];
                    gvPhieuThuChiTiet.FirstDisplayedCell = gvPhieuThuChiTiet.Rows[gvPhieuThuChiTiet.Rows.Count - 1].Cells["NoiDungThu"];
                    bKetQua = true;
                }
                else if (keyData == (Keys.Control | Keys.S) && (btnThuTien.Enabled))
                {
                    btnThuTien_Click(null, null);
                }
                else if (keyData == Keys.F5)
                {
                    LamTuoiManHinh();
                }
                else
                    // bKetQua = base.ProcessCmdKey(ref msg, keyData);
                    bKetQua = false;
                return bKetQua;
            }
            catch (Exception) { }

            return bKetQua;
        }

        private void btnTimKiemKH_Click(object sender, EventArgs e)
        {
            frmQuanLyKhachHangMoi fKhachHang = new frmQuanLyKhachHangMoi(txtTenKhachHang.Text);
            fKhachHang.ShowDialog();
            if (fKhachHang.KhachHangInfo != null)
            {
                KhachHang = fKhachHang.KhachHangInfo;
                txtMaKhachHang.Text = fKhachHang.KhachHangInfo.MaKhachHang;
                txtTenKhachHang.Text = fKhachHang.KhachHangInfo.HoTen;
                txtMaSoThue.Text = fKhachHang.KhachHangInfo.MaSoThue;
                txtDiaChiaXHD.Text = fKhachHang.KhachHangInfo.DiaChi;
                if (KhachHang.MaKhachHang.Substring(0,2).ToUpper()=="CL")
                {
                    LayThongTinCongNoHienThiLuoiThuTien();
                    
                }
                else
                {
                    gvThe.DataSource = new clsTheBUS().LayBangTheChuaThu(fKhachHang.KhachHangInfo.KhachHangId);
                    ChonCacTheThanhToan();
                    gvPhieuThuChiTiet.Rows.Clear();
                    //gvPhieuThuChiTiet.DataSource = TaoBangLuoiThuTien();
                    ThemMotDongTrong();
                }
            }
        }

        private void LayThongTinCongNoHienThiLuoiThuTien()
        {
            List<clsCongNoCauLongDTO> CacCongNo = new clsCongNoCauLongBUS().LayDanhSachCongNoChuaThu(KhachHang.KhachHangId);
            if (CacCongNo != null && CacCongNo.Count > 0)
            {
                try
                {
                    gvPhieuThuChiTiet.Rows.Clear();
                    DINH_KHOAN_CO DinhKhoanCo = new CMS_DinhKhoan().GetInfoDinhKhoanCoDoanhThuCauLongDauTien();
                    DINH_KHOAN_NO DinhKhoanNo = new CMS_DinhKhoan().GetChiTietDinhKhoanNoMacDinh();
                    string TKNo = DinhKhoanNo == null ? null : DinhKhoanNo.TAI_KHOAN_NO.ToString();
                    string TKCo = DinhKhoanCo == null ? null : DinhKhoanCo.TAI_KHOAN_CO.ToString();
                    for (int i = 0; i < CacCongNo.Count; i++)
                    {
                            int? TheId = null;
                            string NoiDung = "Thu cầu lông " + CacCongNo[i].Thang.ToString() + "/" + CacCongNo[i].Nam.ToString();
                            Decimal TienThu = (int)CacCongNo[i].SoTien;
                            ThemMotDongVaoLuoiThuTien(TheId, NoiDung, TienThu, null, TKNo, TKCo, CacCongNo[i].CongNoId);
                    }
                    TinhTongCongNo();
                    DinhDangDongCongNoChuyenXuong();
                }
                catch (Exception ex)
                {
                    //MessageBox.Show(
                }
            }
        }

        private void DinhDangDongCongNoChuyenXuong()
        {
            for (int i = 0; i < gvPhieuThuChiTiet.RowCount; i++)
            {
                Decimal TheId;
                if (gvPhieuThuChiTiet.Rows[i].Cells["CongNoId"].Value != null
                    && !string.IsNullOrEmpty(gvPhieuThuChiTiet.Rows[i].Cells["CongNoId"].Value.ToString())
                    && Decimal.TryParse(gvPhieuThuChiTiet.Rows[i].Cells["CongNoId"].Value.ToString(), out TheId))
                {
                    gvPhieuThuChiTiet.Rows[i].ReadOnly = true;
                }
            }
        }

        private void DinhDangKhongChoPhepChinhSuaMotDong(int i)
        {
           if(i < gvPhieuThuChiTiet.RowCount)
            {
                gvPhieuThuChiTiet.Rows[i].ReadOnly = true;
            }
        }

        private void txtTenKhachHang_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter && txtTenKhachHang.Text.Trim() != "")
            {
                btnTimKiemKH_Click(null, null);
            }
        }

        private void gvPhieuThuChiTiet_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyData ==( Keys.Control | Keys.D))
            {
                try
                {
                    int r = gvPhieuThuChiTiet.CurrentCell.RowIndex;
                    if (r >= 0)
                    {
                        string TheThuId = gvPhieuThuChiTiet.Rows[r].Cells["TheThuId"].Value == null ? null : gvPhieuThuChiTiet.Rows[r].Cells["TheThuId"].Value.ToString();
                        if (!string.IsNullOrEmpty(TheThuId))
                        {

                            for (int i = 0; i < gvThe.RowCount; i++)
                            {
                                string TheId = gvThe.Rows[i].Cells["TheId"].Value == null ? null : gvThe.Rows[i].Cells["TheId"].Value.ToString();
                                if (TheThuId == TheId)
                                {
                                    gvThe.Rows[i].Visible = true;
                                }
                            }
                        }
                        gvPhieuThuChiTiet.Rows.RemoveAt(r);
                        TinhTongCongNo();
                    }
                }
                catch (Exception ex)
                {
                    //MessageBox.Show(
                }
            }
        }

        private void gvPhieuThuChiTiet_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                if (e.ColumnIndex >= 0 && e.RowIndex >= 0)
                {
                    if (string.Equals(gvPhieuThuChiTiet.Columns[e.ColumnIndex].Name, "TienThu")
                        || string.Equals(gvPhieuThuChiTiet.Columns[e.ColumnIndex].Name, "ChietKhau"))
                    {
                        TinhTongCongNo();
                    }
                }
            }
            catch (Exception ex)
            {
            }
        }

        //private void gvPhieuThuChiTiet_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
        //{
        //    if (e.Control is DataGridViewComboBoxEditingControl)
        //    {
        //        ((ComboBox)e.Control).DropDownStyle = ComboBoxStyle.DropDown;
        //        ((ComboBox)e.Control).AutoCompleteSource = AutoCompleteSource.ListItems;
        //        ((ComboBox)e.Control).AutoCompleteMode = System.Windows.Forms.AutoCompleteMode.Suggest;
        //    }
        //}

        private void frmXuatPhieuThu_Load(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(MaKhachHangVangLaiCauLong))
            {
                KhoiTaoManHinh();
            }
            SetPermission();
        }

        private void btnChuyenXuong_Click(object sender, EventArgs e)
        {
            try
            {
                DINH_KHOAN_CO DinhKhoanCo = new CMS_DinhKhoan().GetChiTietDinhKhoanCoMacDinh();
                DINH_KHOAN_NO DinhKhoanNo = new CMS_DinhKhoan().GetChiTietDinhKhoanNoMacDinh();
                string TKNo = DinhKhoanNo == null ? null : DinhKhoanNo.TAI_KHOAN_NO.ToString();
                string TKCo = DinhKhoanCo == null ? null : DinhKhoanCo.TAI_KHOAN_CO.ToString();
                for (int i = 0; i < gvThe.RowCount; i++)
                {
                    Boolean IsCheck = gvThe.Rows[i].Cells["Chon"].Value == null || string.IsNullOrEmpty(gvThe.Rows[i].Cells["Chon"].Value.ToString()) ? false : Boolean.Parse(gvThe.Rows[i].Cells["Chon"].Value.ToString());
                    if (IsCheck && gvThe.Rows[i].Visible)
                    {
                        int? TheId = (int?)int.Parse(gvThe.Rows[i].Cells["TheId"].Value.ToString());
                        DateTime NgayBatDau = DateTime.Parse(gvThe.Rows[i].Cells["NgayBatDau"].Value.ToString());
                        DateTime NgayKetThuc = DateTime.Parse(gvThe.Rows[i].Cells["NgayKetThuc"].Value.ToString());
                        string NoiDung = "Thể hình (Thẻ [ " + (gvThe.Rows[i].Cells["MaThe"].Value == null ? " " : gvThe.Rows[i].Cells["MaThe"].Value.ToString())+ "] từ ngày: " + NgayBatDau.ToString("dd/MM/yyyy") + " đến " + NgayKetThuc.ToString("dd/MM/yyyy") + ")";
                        Decimal TienThu = Decimal.Parse(gvThe.Rows[i].Cells["ThanhTien"].Value.ToString());
                        ThemMotDongVaoLuoiThuTien(TheId, NoiDung, TienThu, null, TKNo, TKCo,null);
                        //ThemMotDongTrong();
                        gvThe.CurrentCell = null;
                        gvThe.Rows[i].Visible = false;
                    }
                }
                TinhTongCongNo();
                DinhDangDongChuyenXuong();
            }
            catch (Exception ex)
            {
                //MessageBox.Show(
            }
        }

        private void DinhDangDongChuyenXuong()
        {
            for (int i = 0; i < gvPhieuThuChiTiet.RowCount; i++)
            {
                Decimal TheId;
                if (gvPhieuThuChiTiet.Rows[i].Cells["TheThuId"].Value != null
                    && !string.IsNullOrEmpty(gvPhieuThuChiTiet.Rows[i].Cells["TheThuId"].Value.ToString())
                    && Decimal.TryParse(gvPhieuThuChiTiet.Rows[i].Cells["TheThuId"].Value.ToString(), out TheId))
                {
                    gvPhieuThuChiTiet.Rows[i].ReadOnly = true;
                }
            }
        }

        private void btnThuTien_Click(object sender, EventArgs e)
        {
            try
            {
                string Error = string.Empty;
                int indexforcus = 0;
                if (KiemTraKhoiTaoPhieuThu(ref Error, ref indexforcus))
                {
                    clsPhieuThuTienDTO PhieuThu = KhoiTaoPhieuThu(ref  Error);
                    if (!new clsPhieuThuTienBUS().KiemTraTonTai(PhieuThu.SoPhieuThu, PhieuThu.KyHieu))
                    {                   
                        #region thực hiện
                        try
                        {
                            CSQLServer.BeginTran();
                            if (new clsPhieuThuTienBUS().Them(ref PhieuThu, ref Error))
                            {
                                CSQLServer.Commit();
                                if (chkIn.Checked)
                                {
                                    frmPhieuThuReportViewer PTReportViewer = new frmPhieuThuReportViewer(PhieuThu);
                                    PTReportViewer.ShowDialog();
                                }
                                if (!string.IsNullOrEmpty(MaKhachHangVangLaiCauLong))
                                {
                                    isThuTienVangLaiCauLong = true;
                                    this.Close();
                                }
                                MessageBox.Show("Lưu phiếu thu thành công!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                                LamTuoiManHinh();
                                string SoPhieuThuMoi = PhatSinhSoPhieuThuTiepTheo(txtSoPhieuThu.Text.Trim(), ref Error);
                                txtSoPhieuThu.Text = SoPhieuThuMoi;
                                GhiSoPhieuThuVaKyHieuMacDinh(SoPhieuThuMoi, txtKyHieu.Text.Trim());
                            }
                            else
                            {
                                CSQLServer.RollBack();
                                MessageBox.Show(Error, "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            }
                        }
                        catch (Exception ex)
                        {
                            CSQLServer.RollBack();
                            MessageBox.Show("Thực hiện thu tiền xuất phiếu thu không thành công nguyên nhân do " + Error + "!", "Chức năng thu tiền xuất phiếu thu", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                    #endregion

                    }
                    else
                    {
                        Error = "Phiếu thu với số phiếu thu '" + PhieuThu.SoPhieuThu + "' và ký hiệu '" + PhieuThu.KyHieu + "' đã tồn tại trong hệ thống!";
                        MessageBox.Show(Error, "Chức năng thu tiền xuất phiếu thu", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
                else
                {
                    MessageBox.Show(Error, "Chức năng thu tiền xuất phiếu thu", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    //SetFocus(9);
                }
            }
            catch(Exception ex)
            {
                
            }
        }

        #endregion 

        #region Funtions
        private void KhoiTaoManHinh()
        {
            gvThe.AutoGenerateColumns = false;
            gvPhieuThuChiTiet.AutoGenerateColumns = false;
            gvPhieuThuChiTiet.Columns["TienThu"].ValueType = typeof(decimal);
            gvPhieuThuChiTiet.Columns["ChietKhau"].ValueType = typeof(decimal);
            txtdNgayXuat.value = DateTime.Now;
            DocSoPhieuThuVaKyHieuMacDinh();
            //gvPhieuThuChiTiet.Rows.Add(7);
            //CMS_DinhKhoan DinhKhoan = new CMS_DinhKhoan();
            //DataGridViewComboBoxColumn TKCo1 = new DataGridViewComboBoxColumn();
            //TKCo1.HeaderText = "TKNo";
            //TKCo1.Name= "TKNo1";
            //TKCo1.DataSource = DinhKhoan.GetDinhKhoanCoCoHieuLuc();
            //TKCo1.DisplayMember = "TAI_KHOAN_CO";
            //TKCo1.DisplayMember = "TAI_KHOAN_CO";
            //gvPhieuThuChiTiet.Columns.Add(TKCo1);
            //gvPhieuThuChiTiet.DataSource = TaoBangLuoiThuTien();
            ThemMotDongTrong();
        }

        private DataTable TaoBangLuoiThuTien()
        {
            DataTable dtTmp =new DataTable();
            dtTmp.Columns.Add("TheThuId", typeof(decimal));
            dtTmp.Columns.Add("NoiDungThu", typeof(string));
            dtTmp.Columns.Add("TienThu", typeof(decimal));
            dtTmp.Columns.Add("ChietKhau", typeof(decimal));
            dtTmp.Columns.Add("TaiKhoanNo", typeof(string));
            dtTmp.Columns.Add("TaiKhoanCo", typeof(string));
            dtTmp.Columns.Add("CongNoId", typeof(string));
            return dtTmp;
        }

        private void DocSoPhieuThuVaKyHieuMacDinh()
        {
            txtSoPhieuThu.Text = clsSupport.ReadAppConfig("SoPhieuThu");
            txtKyHieu.Text = clsSupport.ReadAppConfig("KyHieuPhieuThu");
            if (string.IsNullOrEmpty(txtSoPhieuThu.Text) || string.IsNullOrEmpty(txtKyHieu.Text))
            {
                MessageBox.Show("Không đọc được Số phiếu thu hoặc Ký hiệu phiếu thu nguyên nhân có thể user của bạn không có quyền đọc và ghi Registry!", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }

        private void GhiSoPhieuThuVaKyHieuMacDinh(string SoPhieuThu, string KyHieu)
        {
            string Error = string.Empty;
            clsSupport.WriteAppConfig("SoPhieuThu", SoPhieuThu);
            clsSupport.WriteAppConfig("KyHieuPhieuThu", KyHieu);
        }

        private string PhatSinhSoPhieuThuTiepTheo(string SoPhieuThu,ref string Error)
        {
            try
            {
                int iSoPhieuThu = int.Parse(SoPhieuThu);
                iSoPhieuThu += 1;
                //Số ký tự phiếu thu
                int SoKTPT = SoPhieuThu.Length;
                //Số ký tự của số sau khi tăng 1 đơn vị
                int SoKTPS = iSoPhieuThu.ToString().Length;
                string SoPhieuThuMoi = string.Empty;
                for (int i = 1; i <= SoKTPT - SoKTPS; i++)
                {
                    SoPhieuThuMoi += "0";
                }
                SoPhieuThuMoi += iSoPhieuThu.ToString();
                return SoPhieuThuMoi;
            }
            catch(Exception ex)
            {
                Error = "Phát sinh số phiếu thu mới không thành công";
                return string.Empty;
            }
        }

        private void LamTuoiManHinh()
        {
            KhachHang = null;
            txtMaKhachHang.Text = string.Empty;
            txtTenKhachHang.Text = string.Empty;
            txtMaSoThue.Text = string.Empty;
            txtDiaChiaXHD.Text = string.Empty;
            txtGhiChu.Text = string.Empty;
            gvThe.DataSource = null;
            gvPhieuThuChiTiet.Rows.Clear();
            lblTongTienThu.Text = "0";
            lblTongChietKhau.Text = "0";
            txtTenKhachHang.Focus();

        }

        private void ChonCacTheThanhToan()
        {
            for (int i = 0; i < gvThe.RowCount; i++)
            {
                gvThe.Rows[i].Cells["Chon"].Value = true;
            }
        }

        /// <summary>
        /// Them mot dong co noi dung tren luoi thu tien
        /// </summary>
        /// <param name="TheId"></param>
        /// <param name="NoiDung"></param>
        /// <param name="TienThu"></param>
        /// <param name="ChietKhau"></param>
        /// <param name="TKNo"></param>
        /// <param name="TKCo"></param>
        private void ThemMotDongVaoLuoiThuTien(int? TheId, string NoiDung, Decimal TienThu, Decimal? ChietKhau, string TKNo, string TKCo, int? CongNoId)
        {
            Boolean Flag = false;
            this.gvPhieuThuChiTiet.Focus();
            for (int i = 0; i < gvPhieuThuChiTiet.RowCount; i++)
            {
                if (KiemTraDongThuTienTrong(i))
                {
                    GanGiaTriMotDongLuoiThuTien(i, TheId, NoiDung, TienThu, ChietKhau, TKNo, TKCo, CongNoId);
                    Flag = true;
                    break;
                }
            }
            if(!Flag)
            {
                ThemMotDongTrong();
                for (int i = 0; i < gvPhieuThuChiTiet.RowCount; i++)
                {
                    if (KiemTraDongThuTienTrong(i))
                    {
                        GanGiaTriMotDongLuoiThuTien(i, TheId, NoiDung, TienThu, ChietKhau, TKNo, TKCo, CongNoId);
                        Flag = true;
                        break;
                    }
                }
            }
        }
        
        /// <summary>
        /// Kiem tra mot dong trong tren luoi thu tien
        /// </summary>
        /// <param name="i"></param>
        /// <returns></returns>
        private bool KiemTraDongThuTienTrong(int i)
        {
            if (  (gvPhieuThuChiTiet.Rows[i].Cells["TheThuId"].Value == null || string.IsNullOrEmpty(gvPhieuThuChiTiet.Rows[i].Cells["TheThuId"].Value.ToString()))
                && (gvPhieuThuChiTiet.Rows[i].Cells["NoiDungThu"].Value == null || string.IsNullOrEmpty(gvPhieuThuChiTiet.Rows[i].Cells["NoiDungThu"].Value.ToString()))
                && (gvPhieuThuChiTiet.Rows[i].Cells["TienThu"].Value == null || string.IsNullOrEmpty(gvPhieuThuChiTiet.Rows[i].Cells["TienThu"].Value.ToString()))
                && (gvPhieuThuChiTiet.Rows[i].Cells["ChietKhau"].Value == null || string.IsNullOrEmpty(gvPhieuThuChiTiet.Rows[i].Cells["ChietKhau"].Value.ToString()))
                && (gvPhieuThuChiTiet.Rows[i].Cells["TaiKhoanNo"].Value == null || string.IsNullOrEmpty(gvPhieuThuChiTiet.Rows[i].Cells["TaiKhoanNo"].Value.ToString()))
                && (gvPhieuThuChiTiet.Rows[i].Cells["TaiKhoanCo"].Value == null || string.IsNullOrEmpty(gvPhieuThuChiTiet.Rows[i].Cells["TaiKhoanCo"].Value.ToString()))
                && (gvPhieuThuChiTiet.Rows[i].Cells["CongNoId"].Value == null || string.IsNullOrEmpty(gvPhieuThuChiTiet.Rows[i].Cells["TaiKhoanCo"].Value.ToString()))
                )
            {
                return true;
            }
            return false;
        }

        private void GanGiaTriMotDongLuoiThuTien(int DongThu, int? TheId, string NoiDung, Decimal TienThu, Decimal? ChietKhau, string TKNo, string TKCo, int? CongNoId)
        {
            gvPhieuThuChiTiet.Rows[DongThu].Cells["TheThuId"].Value = TheId;
            gvPhieuThuChiTiet.Rows[DongThu].Cells["NoiDungThu"].Value = NoiDung;
            gvPhieuThuChiTiet.Rows[DongThu].Cells["TienThu"].Value = TienThu;
            gvPhieuThuChiTiet.Rows[DongThu].Cells["ChietKhau"].Value =  ChietKhau;
            gvPhieuThuChiTiet.Rows[DongThu].Cells["TaiKhoanNo"].Value = TKNo;
            gvPhieuThuChiTiet.Rows[DongThu].Cells["TaiKhoanCo"].Value = TKCo;
            gvPhieuThuChiTiet.Rows[DongThu].Cells["CongNoId"].Value = CongNoId;
        }
      
        /// <summary>
        /// Them mot dong trong tren luoi thu tien
        /// </summary>
        private void ThemMotDongTrong()
        {
            object[] obj = new object[7] { null, null, null, null, null, null ,null};
            gvPhieuThuChiTiet.Rows.Add(obj);
            
        }

        /// <summary>
        /// Khoi tao mot phieu thu
        /// </summary>
        /// <param name="Error"></param>
        /// <returns></returns>
        private clsPhieuThuTienDTO KhoiTaoPhieuThu(ref string Error)
        {
            clsPhieuThuTienDTO PhieuThu = new clsPhieuThuTienDTO();
            PhieuThu.SoPhieuThu = txtSoPhieuThu.Text;
            PhieuThu.KyHieu = txtKyHieu.Text;
            PhieuThu.Ky = txtdNgayXuat.value.ToString("MM/yyyy");
            PhieuThu.NgayXuat = txtdNgayXuat.value;
            PhieuThu.KhachHangId = (KhachHang == null ? null : (decimal?)KhachHang.KhachHangId);
            PhieuThu.MaKhachHang = txtMaKhachHang.Text;
            PhieuThu.HoTen = txtTenKhachHang.Text;
            PhieuThu.MaSoThue = txtMaSoThue.Text;
            PhieuThu.DiaChi = txtDiaChiaXHD.Text;
            PhieuThu.PhanTramThue = int.Parse(txtThueVAT.Text);
            PhieuThu.GhiChu = txtGhiChu.Text;
            PhieuThu.NguoiTaoId = clsUser.NhanVienId;
            for (int i = 0; i < gvPhieuThuChiTiet.RowCount; i++)
            {
                if (!KiemTraDongThuTienTrong(i))
                {
                    clsPhieuThuTienChiTietDTO PTCT = KhoiTaoPhieuThuChiTiet(i, PhieuThu.PhanTramThue);
                    if (PTCT == null)
                    {
                        Error = "Khởi tạo phiếu thu chi tiết không thành công!";
                        return null;
                    }
                    else
                    {
                        PhieuThu.TongTienThu += PTCT.TienThu;
                        PhieuThu.TongTienHang += PTCT.TienHang;
                        PhieuThu.TongTienThue += PTCT.TienThue;
                        PhieuThu.TongChietKhau += PTCT.ChietKhau;
                        PhieuThu.CacPTCT.Add(PTCT);
                    }
                }
            }

            return PhieuThu;
        }

        /// <summary>
        /// Khoi tao mot phieu thu chi tiet
        /// </summary>
        /// <param name="i"></param>
        /// <param name="ThueGTGT"></param>
        /// <returns></returns>
        private clsPhieuThuTienChiTietDTO KhoiTaoPhieuThuChiTiet(int i, int ThueGTGT)
        {
            try
            {
                clsPhieuThuTienChiTietDTO PTCT = new clsPhieuThuTienChiTietDTO();
                PTCT.NoiDungThu = gvPhieuThuChiTiet.Rows[i].Cells["NoiDungThu"].Value.ToString();
                PTCT.TienThu = Double.Parse(gvPhieuThuChiTiet.Rows[i].Cells["TienThu"].Value.ToString());
                PTCT.TienThue = ThueGTGT > 0 ? Math.Round(PTCT.TienThu / ThueGTGT, 0) : 0;
                PTCT.TienHang = PTCT.TienThu - PTCT.TienThue;
                PTCT.ChietKhau = gvPhieuThuChiTiet.Rows[i].Cells["ChietKhau"].Value == null || string.IsNullOrEmpty(gvPhieuThuChiTiet.Rows[i].Cells["ChietKhau"].Value.ToString()) ? 0 : Double.Parse(gvPhieuThuChiTiet.Rows[i].Cells["ChietKhau"].Value.ToString());
                PTCT.TaiKhoanNo = gvPhieuThuChiTiet.Rows[i].Cells["TaiKhoanNo"].Value.ToString();
                PTCT.TaiKhoanCo = gvPhieuThuChiTiet.Rows[i].Cells["TaiKhoanCo"].Value.ToString();
                PTCT.TheId = gvPhieuThuChiTiet.Rows[i].Cells["TheThuId"].Value == null || string.IsNullOrEmpty(gvPhieuThuChiTiet.Rows[i].Cells["TheThuId"].Value.ToString()) ? null : (decimal?)decimal.Parse(gvPhieuThuChiTiet.Rows[i].Cells["TheThuId"].Value.ToString());
                PTCT.CongNoId = gvPhieuThuChiTiet.Rows[i].Cells["CongNoId"].Value == null || string.IsNullOrEmpty(gvPhieuThuChiTiet.Rows[i].Cells["CongNoId"].Value.ToString()) ? null : (decimal?)decimal.Parse(gvPhieuThuChiTiet.Rows[i].Cells["CongNoId"].Value.ToString());
                return PTCT;
            }
            catch (Exception ex)
            {
                return null;
            }
        }

        private bool KiemTraKhoiTaoPhieuThu(ref string strError, ref int indexforcus)
        {
            bool Flag = true;
            strError = "Lỗi phát sinh: ";

            #region Kiểm tra phiếu thu
            //Kiểm tra Tên khách hàng 
            string TEN_TB = txtTenKhachHang.Text;
            if (TEN_TB.Trim() == "")
            {
                strError += "\n + Tên khách hàng không được bỏ trống!";
                indexforcus = 9;
                return false; 
            }
            #endregion

            #region Kiểm tra Dia chi 
            ////Kiểm tra Tên khách hàng 
            //string DiaChiXHD = txtDiaChiaXHD.Text;
            //if (DiaChiXHD.Trim() == "")
            //{
            //    strError += "\n + Địa chỉ xuất phiếu thu không được bỏ trống!";
            //    indexforcus = 9;
            //        return false; 
            //}
            #endregion

            #region Kiểm tra định dạng số phiếu thu
            //Kiểm tra định dạng số phiếu thu
            string SO_PHIEU_THU = this.txtSoPhieuThu.Text.Trim().Replace(" ", "");
            int SoPhieuThu;
            if (!(SO_PHIEU_THU.Trim() != "" && (SO_PHIEU_THU.Length == 6 || SO_PHIEU_THU.Length == 7) && int.TryParse(SO_PHIEU_THU, out SoPhieuThu)))
            {
                strError += "\n + Số phiếu thu theo định dạng: Số phiếu thu là số gồm 6 hoặc 7 chữ số ví dụ: 000001, 101111, 1234567 ...";
                indexforcus = 9;
                return false; 
            }
            #endregion

            #region Kiểm tra ký hiệu phiếu thu (Đã được kiểm tra trên control)
            //Kiểm tra ký hiệu phiếu thu (Đã được kiểm tra trên control)
            string KY_HIEU_HD = this.txtKyHieu.Text;
            if (KY_HIEU_HD == null || KY_HIEU_HD.Trim() == "")
            {
                strError += "\n + Ký hiệu phiếu thu không được bỏ trống!";
                indexforcus = 9;
                return false; 
            }
            #endregion

            #region Kiểm tra phần trăm thuế suất(Đã được kiểm tra trên control)
            //Kiểm tra phần trăm thuế suất(Đã được kiểm tra trên control)
            int THUE_SUAT;
            if (!int.TryParse(this.txtThueVAT.Text, out THUE_SUAT))
            {
                strError += "\n + Thuế GTGT là một số thực dương: 20%, 10%...";
                indexforcus = 9;
                return false; 
            }
            else
            {
                if (!(THUE_SUAT >= 0 && THUE_SUAT <= 100))
                {
                    strError += "\n + Thuế GTGT phải 0% <= Thuế GTGT <= 100% ";
                    indexforcus = 9;
                    return false; 
                }
            }
            #endregion

            #region Kiểm tra ID nhân viên
            //Kiểm tra ID nhân viên thu tiền
            int MaNguoiDung;
            if (!int.TryParse(clsUser.NhanVienId.ToString(), out MaNguoiDung) && Flag)
            {
                strError += "\n + Không lấy được thông tin người dùng đã đăng nhập!";
                indexforcus = 9;
                return false; 
            }
            #endregion

            #region Kiểm tra lưới thu tiền
            //Kiểm tra lưới thu tiền
            CMS_DinhKhoan DinhKhoan = new CMS_DinhKhoan();
            List<DINH_KHOAN_NO> DinhKhoanNo =DinhKhoan.GetListDinhKhoanNoCoHieuLuc();
            List<DINH_KHOAN_CO> DinhKhoanCo = DinhKhoan.GetListDinhKhoanCoDoanhThuCoHieuLuc();
            if (!KiemTraLuoiThuTien(DinhKhoanNo,DinhKhoanCo, ref strError))
            {
               indexforcus = 9;
               return false; 
            }
            #endregion

            return true;
        }

        /// <summary>
        /// Kiểm tra lưới thu tiền
        /// </summary>
        /// <param name="ThueGTGT"></param>
        /// <param name="Error"></param>
        /// <returns></returns>
        private bool KiemTraLuoiThuTien(List<DINH_KHOAN_NO> DinhKhoanNo, List<DINH_KHOAN_CO> DinhKhoanCo, ref string Error)
        {
            int Count = 0;
            try
            {
                for (int i = 0; i < gvPhieuThuChiTiet.RowCount; i++)
                {
                    if (!KiemTraDongThuTienTrong(i))
                    {
                        Count++;
                        Decimal TienThu;
                        Decimal ChietKhau;
                        int TaiKhoanNo;
                        int TaiKhoanCo;
                        if (gvPhieuThuChiTiet.Rows[i].Cells["NoiDungThu"].Value == null || string.IsNullOrEmpty(gvPhieuThuChiTiet.Rows[i].Cells["NoiDungThu"].Value.ToString()))
                        {
                            Error = "Ô 'Nội dung' thu tiền không được bỏ trống ở dòng thứ " + i.ToString() + "!";
                            return false;
                        }
                        if (gvPhieuThuChiTiet.Rows[i].Cells["TienThu"].Value == null || !Decimal.TryParse(gvPhieuThuChiTiet.Rows[i].Cells["TienThu"].Value.ToString(), out TienThu) || TienThu <= 0)
                        {
                            Error = "Ô 'Tiền thu' phải nhập là số nguyên dương ở dòng thứ " + i.ToString() + "!";
                            return false;
                        }
                        if (gvPhieuThuChiTiet.Rows[i].Cells["ChietKhau"].Value != null &&( !Decimal.TryParse(gvPhieuThuChiTiet.Rows[i].Cells["ChietKhau"].Value.ToString(), out ChietKhau) || ChietKhau < 0))
                        {
                            Error = "Ô 'Chiết khấu' phải nhập là số nguyên dương hoặc bằng 0 ở dòng thứ " + i.ToString() + "!";
                            return false;
                        }
                        if (gvPhieuThuChiTiet.Rows[i].Cells["TaiKhoanNo"].Value == null || !int.TryParse(gvPhieuThuChiTiet.Rows[i].Cells["TaiKhoanNo"].Value.ToString(), out TaiKhoanNo))
                        {
                            Error = "Ô 'TK Nợ' phải nhập là số ở dòng thứ " + i.ToString() + "!";
                            return false;
                        }
                        else
                        {
                            if (!KiemTraDinhKhoanNo(DinhKhoanNo, TaiKhoanNo))
                            {
                                Error = "Ô 'TK Nợ' ở dòng thứ " + i.ToString() + " không tôn tại trong bộ danh mục định khoản nợ!";
                                return false;
                            }
                        }
                        if (gvPhieuThuChiTiet.Rows[i].Cells["TaiKhoanCo"].Value == null || !int.TryParse(gvPhieuThuChiTiet.Rows[i].Cells["TaiKhoanCo"].Value.ToString(), out TaiKhoanCo))
                        {
                            Error = "Ô 'TK Có' phải nhập là số ở dòng thứ " + i.ToString() + "!";
                            return false;
                        }
                        else
                        {
                            if (!KiemTraDinhKhoanCo(DinhKhoanCo, TaiKhoanCo))
                            {
                                Error = "Ô 'TK Có' ở dòng thứ " + i.ToString() + " không tôn tại trong bộ danh mục định khoản thu tiền!";
                                return false;
                            }
                        }
                    }
                }
                if (Count == 0)
                {
                    Error = "Nhập Thông tin chi tiết phiếu thu không được bỏ trống!";
                    return false;
                }
                else
                {
                    return true;
                }
            }
            catch (Exception ex)
            {
                Error = "Khởi tạo phiếu thu không thành công! xin vui lòng kiểm tra lại \r\n" + ex.Message;
                return false;
            }

        }

        private bool KiemTraDinhKhoanNo(List<DINH_KHOAN_NO> DinhKhoanNo,int TaiKhoanNo)
        {
            try
            {
                for (int i = 0; i < DinhKhoanNo.Count; i++)
                {
                    if (DinhKhoanNo[i].TAI_KHOAN_NO == TaiKhoanNo)
                    {
                        return true;
                    }
                }
                return false;
            }
            catch (Exception ex)
            {
                return false;
            }

        }

        private bool KiemTraDinhKhoanCo(List<DINH_KHOAN_CO> DinhKhoanCo, int TaiKhoanCo)
        {
            try
            {
                for (int i = 0; i < DinhKhoanCo.Count; i++)
                {
                    if (DinhKhoanCo[i].TAI_KHOAN_CO == TaiKhoanCo)
                    {
                        return true;
                    }
                }
                return false;
            }
            catch (Exception ex)
            {
                return false;
            }

        } 

        private void TinhTongCongNo()
        {
            try
            {
                double TongTienThu = 0;
                double TongChietKhau = 0;
                for (int i = 0; i < gvPhieuThuChiTiet.RowCount; i++)
                {
                    double TienThu;
                    double ChietKhau;
                    if (double.TryParse((gvPhieuThuChiTiet.Rows[i].Cells["TienThu"].Value == null ? "0" : gvPhieuThuChiTiet.Rows[i].Cells["TienThu"].Value.ToString()), out TienThu))
                    {
                        TongTienThu += TienThu;
                    }
                    if (double.TryParse((gvPhieuThuChiTiet.Rows[i].Cells["ChietKhau"].Value == null ? "0" : gvPhieuThuChiTiet.Rows[i].Cells["ChietKhau"].Value.ToString()), out ChietKhau))
                    {
                        TongChietKhau += ChietKhau;
                    }
                }

                lblTongTienThu.Text =clsSupport.CurrencyNumber(TongTienThu.ToString());
                lblTongChietKhau.Text = clsSupport.CurrencyNumber(TongChietKhau.ToString()); 
                lblSoTienChu.Text = hsTool.ConvertMoneyToText(TongTienThu.ToString());
            }
            catch(Exception ex)
            {}
            
        }

        private void SetPermission()
        {
            btnThuTien.Enabled = clsUser.LayThongTinPhanQuyen("PhieuThu").ChucNang.Them;
        }

        private void KhoiTaoThuTienVangLaiCauLong(int KhachHangId, string MaKhachHang, string HoTen, DateTime TuGio, DateTime DenGio, double SoTien)
        {
            txtMaKhachHang.Text = MaKhachHang;
            txtTenKhachHang.Text = HoTen;
            DINH_KHOAN_CO DinhKhoanCo = new CMS_DinhKhoan().GetInfoDinhKhoanCoDoanhThuCauLongDauTien();
            DINH_KHOAN_NO DinhKhoanNo = new CMS_DinhKhoan().GetChiTietDinhKhoanNoMacDinh();
            string TKNo = DinhKhoanNo == null ? null : DinhKhoanNo.TAI_KHOAN_NO.ToString();
            string TKCo = DinhKhoanCo == null ? null : DinhKhoanCo.TAI_KHOAN_CO.ToString();
            int iThuTien = (int)SoTien;
            string NoiDung =  "Thu cầu lông vãng lai từ thời gian " + TuGio.ToString("hh:mm") + " đến " + DenGio.ToString("hh:mm") ;
            ThemMotDongVaoLuoiThuTien(null, NoiDung, (Decimal)iThuTien, null, TKNo, TKCo,null);
            DinhDangKhongChoPhepChinhSuaMotDong(0);
        }

        private void KhoiTaoThuTienVangLaiTheHinh()
        {
            DINH_KHOAN_CO DinhKhoanCo = new CMS_DinhKhoan().GetChiTietDinhKhoanCoMacDinh();
            DINH_KHOAN_NO DinhKhoanNo = new CMS_DinhKhoan().GetChiTietDinhKhoanNoMacDinh();
            string TKNo = DinhKhoanNo == null ? null : DinhKhoanNo.TAI_KHOAN_NO.ToString();
            string TKCo = DinhKhoanCo == null ? null : DinhKhoanCo.TAI_KHOAN_CO.ToString();
            Double GiaTheHinhTheoNgay = new clsCongTyBUS().GiaTheHinhTheoNgay();
            int iThuTien = (int)GiaTheHinhTheoNgay;
            string NoiDung = "Thu thể hình vãng lai";
            ThemMotDongVaoLuoiThuTien(null, NoiDung, (Decimal)iThuTien, null, TKNo, TKCo,null);
            DinhDangKhongChoPhepChinhSuaMotDong(0);
        }

        #endregion

        private void txtMaKhachHang_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter && txtMaKhachHang.Text.Trim() != "")
            {
                if (txtMaKhachHang.Text.ToUpper() == "THVL")
                {
                    gvPhieuThuChiTiet.Rows.Clear();
                    txtTenKhachHang.Text = "Khách hàng vãng lai thể hình";
                    this.gvPhieuThuChiTiet.Focus();
                    ThemMotDongTrong();
                    KhoiTaoThuTienVangLaiTheHinh();
                }
                if (txtMaKhachHang.Text.ToUpper() == "VL")
                {
                    gvPhieuThuChiTiet.Rows.Clear();
                    txtTenKhachHang.Text = "Khách hàng vãng lai";
                }
            }
        }

    }
}
